package org.chnxi.datastructures.recursion;

import lombok.Data;

/**
 * 递归调用规则：
 * 1、当程序执行到一个方法时，会在当前栈上开辟一个独立的空间（栈帧）；
 * 2、每个栈帧上的数据（局部变量）是独立的；
 * 3、如果如归中传递的是引用类型，栈帧就会共享数据；
 * 4、递归必须向退出递归的条件逼近，否则就是无限递归了（StackOverflowError）；
 * 5、当一个方法执行完毕，或者遇到return，就会返回，遵守谁调用就将结果返回给谁，同时该方法也就执行完毕了。
 */
public class RecursionTest1 {
    public static void main(String[] args) {
        print(4);
        int num = 5;
        System.out.println("1*2*3*……"+num+"="+factorial(num));

        Person person = new Person();
        person.setName("zhangsan");
        changeName(person);
        System.out.println(person);
    }

    public static void changeName(Person person){
        person.setName("new"+person.getName());
    }

    public static void print(int n){
        if(n > 2){
            print(n-1);
        }
        System.out.println("n="+n);
    }

    /**
     * 计算 1 * 2 * 3 * …… n
     * @param n
     * @return
     */
    public static int factorial(int n){
        if(n == 1){
            return 1;
        }else{
            return factorial(n-1)*n;
        }
    }
}

@Data
class Person{

    private  String name;

}
